package com.lxt.ScreencastGallery;

import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.Environment;
import android.provider.MediaStore;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 媒体文件管理器
 */
public class MediaManager {
    
    private Context context;
    
    public MediaManager(Context context) {
        this.context = context;
    }

   public List<MediaItem2> getAllMediaFilesFromLibrary(String libraryPath) {
       List<MediaItem2> mediaItems = new ArrayList<>();
       File directory = new File(libraryPath);
       if (directory.exists() && directory.isDirectory()) {
           scanDirectory(directory, mediaItems);
       }
       return mediaItems;
   }

    /**
     * 获取可用图库列表（Android 提供的 MediaStore 查询）
     * 使用 MediaStore.Images.Media.EXTERNAL_CONTENT_URI 查询所有图像目录
     */
// 在 MediaManager 中改进图库扫描方法
    public List<String> getAvailableLibraries() {
        List<String> libraries = new ArrayList<>();

        // 添加常见图片目录
        File[] commonDirs = new File[]{
                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM),
                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
        };

        for (File dir : commonDirs) {
            if (dir.exists() && dir.isDirectory()) {
                libraries.add(dir.getAbsolutePath());
            }
        }

        // 仍然保留 MediaStore 查询
        Cursor cursor = context.getContentResolver().query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                new String[]{MediaStore.Images.Media.DATA},
                null, null, null
        );

        if (cursor != null) {
            while (cursor.moveToNext()) {
                String path = cursor.getString(0);
                if (path != null) {
                    File file = new File(path);
                    if (file.getParentFile() != null) {
                        String parentPath = file.getParent();
                        if (!libraries.contains(parentPath)) {
                            libraries.add(parentPath);
                        }
                    }
                }
            }
            cursor.close();
        }

        return libraries;
    }

    /**
     * 保存用户上次选择的图库路径
     */
    public void saveSelectedLibrary(String path) {
        SharedPreferences prefs = context.getSharedPreferences("library_config", Context.MODE_PRIVATE);
        prefs.edit().putString("last_library", path).apply();
    }

    /**
     * 获取上次选择的图库路径
     */
    public String getLastSelectedLibrary() {
        SharedPreferences prefs = context.getSharedPreferences("library_config", Context.MODE_PRIVATE);
        return prefs.getString("last_library", null);
    }

    
    /**
     * 获取指定目录的媒体文件
     */
    public List<MediaItem2> getMediaFilesFromDirectory(String directoryPath) {
        List<MediaItem2> mediaItems = new ArrayList<>();
        File directory = new File(directoryPath);
        if (directory.exists() && directory.isDirectory()) {
            scanDirectory(directory, mediaItems);
        }
        return mediaItems;
    }
    
    /**
     * 扫描目录获取媒体文件，并按名称排序，不区分图片和视频
     */
    private void scanDirectory(File directory, List<MediaItem2> mediaItems) {
        if (directory == null || !directory.exists() || !directory.isDirectory()) {
            return;
        }

        File[] files = directory.listFiles();
        if (files == null) {
            return;
        }

        // 使用单一列表存储所有媒体文件
        List<MediaItem2> allMedia = new ArrayList<>();

        for (File file : files) {
            if (file.isDirectory()) {
                // 递归扫描子目录
                scanDirectory(file, mediaItems);
            } else if (isMediaFile(file.getName())) {
                // 添加所有媒体文件到同一列表
                allMedia.add(new MediaItem2(file));
            }
        }

        // 使用数字优先的比较器
        Comparator<MediaItem2> nameComparator = (item1, item2) -> {
            String name1 = item1.getName();
            String name2 = item2.getName();

            // 提取文件名（不包含扩展名）用于比较
            String baseName1 = name1.contains(".") ? name1.substring(0, name1.lastIndexOf(".")) : name1;
            String baseName2 = name2.contains(".") ? name2.substring(0, name2.lastIndexOf(".")) : name2;

            // 检查是否都是数字开头
            boolean isNum1 = baseName1.matches("^\\d+.*");
            boolean isNum2 = baseName2.matches("^\\d+.*");

            // 数字文件名优先于非数字文件名
            if (isNum1 && !isNum2) {
                return -1;
            } else if (!isNum1 && isNum2) {
                return 1;
            }

            // 如果都是数字开头，按数字大小排序
            if (isNum1 && isNum2) {
                // 提取数字部分
                String numStr1 = extractLeadingNumber(baseName1);
                String numStr2 = extractLeadingNumber(baseName2);

                try {
                    int num1 = Integer.parseInt(numStr1);
                    int num2 = Integer.parseInt(numStr2);
                    int result = Integer.compare(num1, num2);
                    if (result != 0) {
                        return result;
                    }
                    // 如果数字相同，按剩余部分排序
                    String rest1 = baseName1.substring(numStr1.length());
                    String rest2 = baseName2.substring(numStr2.length());
                    return rest1.compareTo(rest2);
                } catch (NumberFormatException e) {
                    // 如果解析失败，使用字符串比较
                    return baseName1.compareTo(baseName2);
                }
            }

            // 都不是数字开头，使用标准字符排序
            return java.text.Collator.getInstance(java.util.Locale.ENGLISH)
                    .compare(name1, name2);
        };

        // 对所有媒体文件按名称排序
        Collections.sort(allMedia, nameComparator);

        // 添加到最终结果
        mediaItems.addAll(allMedia);
    }


    // 添加辅助方法
    private String extractLeadingNumber(String str) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (Character.isDigit(c)) {
                sb.append(c);
            } else {
                break;
            }
        }
        return sb.toString();
    }




    /**
     * 判断是否为支持的媒体文件
     */
    private boolean isMediaFile(String fileName) {
        String extension = AppConfig.getFileExtension(fileName);
        return AppConfig.isSupportedImageFormat(extension) || AppConfig.isSupportedVideoFormat(extension);
    }
}
